//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension SSMQuickSetup {
    // MARK: Enums

    public enum Status: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deleteFailed = "DELETE_FAILED"
        case deleting = "DELETING"
        case deploying = "DEPLOYING"
        case failed = "FAILED"
        case initializing = "INITIALIZING"
        case none = "NONE"
        case stopFailed = "STOP_FAILED"
        case stopped = "STOPPED"
        case stopping = "STOPPING"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum StatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case asyncExecutions = "AsyncExecutions"
        case deployment = "Deployment"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct ConfigurationDefinition: AWSDecodableShape {
        /// The ID of the configuration definition.
        public let id: String?
        /// The ARN of the IAM role used to administrate local configuration deployments.
        public let localDeploymentAdministrationRoleArn: String?
        /// The name of the IAM role used to deploy local configurations.
        public let localDeploymentExecutionRoleName: String?
        /// A list of key-value pairs containing the required parameters for the configuration type.
        public let parameters: [String: String]
        /// The type of the Quick Setup configuration.
        public let type: String
        /// The version of the Quick Setup type used.
        public let typeVersion: String?

        @inlinable
        public init(id: String? = nil, localDeploymentAdministrationRoleArn: String? = nil, localDeploymentExecutionRoleName: String? = nil, parameters: [String: String], type: String, typeVersion: String? = nil) {
            self.id = id
            self.localDeploymentAdministrationRoleArn = localDeploymentAdministrationRoleArn
            self.localDeploymentExecutionRoleName = localDeploymentExecutionRoleName
            self.parameters = parameters
            self.type = type
            self.typeVersion = typeVersion
        }

        private enum CodingKeys: String, CodingKey {
            case id = "Id"
            case localDeploymentAdministrationRoleArn = "LocalDeploymentAdministrationRoleArn"
            case localDeploymentExecutionRoleName = "LocalDeploymentExecutionRoleName"
            case parameters = "Parameters"
            case type = "Type"
            case typeVersion = "TypeVersion"
        }
    }

    public struct ConfigurationDefinitionInput: AWSEncodableShape {
        /// The ARN of the IAM role used to administrate local configuration deployments.
        public let localDeploymentAdministrationRoleArn: String?
        /// The name of the IAM role used to deploy local configurations.
        public let localDeploymentExecutionRoleName: String?
        /// The parameters for the configuration definition type. Parameters for configuration definitions vary based the configuration type. The following tables outline the parameters for each configuration type.  OpsCenter (Type: Amazon Web ServicesQuickSetupType-SSMOpsCenter)     DelegatedAccountId    Description: (Required) The ID of the delegated administrator account.      TargetOrganizationalUnits    Description: (Required) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Resource Scheduler (Type: Amazon Web ServicesQuickSetupType-Scheduler)     TargetTagKey    Description: (Required) The tag key assigned to the instances you want to target.      TargetTagValue    Description: (Required) The value of the tag key assigned to the instances you want to target.      ICalendarString    Description: (Required) An iCalendar formatted string containing the schedule you want Change Manager to use.      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Default Host Management Configuration (Type: Amazon Web ServicesQuickSetupType-DHMC)     UpdateSSMAgent    Description: (Optional) A boolean value that determines whether the SSM Agent is updated on the target instances every 2 weeks. The default value is "true".      TargetOrganizationalUnits    Description: (Required) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Resource Explorer (Type: Amazon Web ServicesQuickSetupType-ResourceExplorer)     SelectedAggregatorRegion    Description: (Required) The Amazon Web Services Region where you want to create the aggregator index.      ReplaceExistingAggregator    Description: (Required) A boolean value that determines whether to demote an existing aggregator if it is in a Region that differs from the value you specify for the SelectedAggregatorRegion.      TargetOrganizationalUnits    Description: (Required) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Change Manager (Type: Amazon Web ServicesQuickSetupType-SSMChangeMgr)     DelegatedAccountId    Description: (Required) The ID of the delegated administrator account.      JobFunction    Description: (Required) The name for the Change Manager job function.      PermissionType    Description: (Optional) Specifies whether you want to use default administrator permissions for the job function role, or provide a custom IAM policy. The valid values are CustomPermissions and AdminPermissions. The default value for the parameter is CustomerPermissions.      CustomPermissions    Description: (Optional) A JSON string containing the IAM policy you want your job function to use. You must provide a value for this parameter if you specify CustomPermissions for the PermissionType parameter.      TargetOrganizationalUnits    Description: (Required) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      DevOps Guru (Type: Amazon Web ServicesQuickSetupType-DevOpsGuru)     AnalyseAllResources    Description: (Optional) A boolean value that determines whether DevOps Guru analyzes all CloudFormation stacks in the account. The default value is "false".      EnableSnsNotifications    Description: (Optional) A boolean value that determines whether DevOps Guru sends notifications when an insight is created. The default value is "true".      EnableSsmOpsItems    Description: (Optional) A boolean value that determines whether DevOps Guru creates an OpsCenter OpsItem when an insight is created. The default value is "true".      EnableDriftRemediation    Description: (Optional) A boolean value that determines whether a drift remediation schedule is used. The default value is "false".      RemediationSchedule    Description: (Optional) A rate expression that defines the schedule for drift remediation. The valid values are rate(30 days), rate(14 days), rate(1 days), and none. The default value is "none".      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Conformance Packs (Type: Amazon Web ServicesQuickSetupType-CFGCPacks)     DelegatedAccountId    Description: (Optional) The ID of the delegated administrator account. This parameter is required for Organization deployments.      RemediationSchedule    Description: (Optional) A rate expression that defines the schedule for drift remediation. The valid values are rate(30 days), rate(14 days), rate(2 days), and none. The default value is "none".      CPackNames    Description: (Required) A comma separated list of Config conformance packs.      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) The ID of the root of your Organization. This configuration type doesn't currently support choosing specific OUs. The configuration will be deployed to all the OUs in the Organization.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Config Recording (Type: Amazon Web ServicesQuickSetupType-CFGRecording)     RecordAllResources    Description: (Optional) A boolean value that determines whether all supported resources are recorded. The default value is "true".      ResourceTypesToRecord    Description: (Optional) A comma separated list of resource types you want to record.      RecordGlobalResourceTypes    Description: (Optional) A boolean value that determines whether global resources are recorded with all resource configurations. The default value is "false".      GlobalResourceTypesRegion    Description: (Optional) Determines the Amazon Web Services Region where global resources are recorded.      UseCustomBucket    Description: (Optional) A boolean value that determines whether a custom Amazon S3 bucket is used for delivery. The default value is "false".      DeliveryBucketName    Description: (Optional) The name of the Amazon S3 bucket you want Config to deliver configuration snapshots and configuration history files to.      DeliveryBucketPrefix    Description: (Optional) The key prefix you want to use in the custom Amazon S3 bucket.      NotificationOptions    Description: (Optional) Determines the notification configuration for the recorder. The valid values are NoStreaming, UseExistingTopic, and CreateTopic. The default value is NoStreaming.      CustomDeliveryTopicAccountId    Description: (Optional) The ID of the Amazon Web Services account where the Amazon SNS topic you want to use for notifications resides. You must specify a value for this parameter if you use the UseExistingTopic notification option.      CustomDeliveryTopicName    Description: (Optional) The name of the Amazon SNS topic you want to use for notifications. You must specify a value for this parameter if you use the UseExistingTopic notification option.      RemediationSchedule    Description: (Optional) A rate expression that defines the schedule for drift remediation. The valid values are rate(30 days), rate(7 days), rate(1 days), and none. The default value is "none".      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) The ID of the root of your Organization. This configuration type doesn't currently support choosing specific OUs. The configuration will be deployed to all the OUs in the Organization.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Host Management (Type: Amazon Web ServicesQuickSetupType-SSMHostMgmt)     UpdateSSMAgent    Description: (Optional) A boolean value that determines whether the SSM Agent is updated on the target instances every 2 weeks. The default value is "true".      UpdateEc2LaunchAgent    Description: (Optional) A boolean value that determines whether the EC2 Launch agent is updated on the target instances every month. The default value is "false".      CollectInventory    Description: (Optional) A boolean value that determines whether the EC2 Launch agent is updated on the target instances every month. The default value is "true".      ScanInstances    Description: (Optional) A boolean value that determines whether the target instances are scanned daily for available patches. The default value is "true".      InstallCloudWatchAgent    Description: (Optional) A boolean value that determines whether the Amazon CloudWatch agent is installed on the target instances. The default value is "false".      UpdateCloudWatchAgent    Description: (Optional) A boolean value that determines whether the Amazon CloudWatch agent is updated on the target instances every month. The default value is "false".      IsPolicyAttachAllowed    Description: (Optional) A boolean value that determines whether Quick Setup attaches policies to instances profiles already associated with the target instances. The default value is "false".      TargetType    Description: (Optional) Determines how instances are targeted for local account deployments. Don't specify a value for this parameter if you're deploying to OUs. The valid values are *, InstanceIds, ResourceGroups, and Tags. Use * to target all instances in the account.      TargetInstances    Description: (Optional) A comma separated list of instance IDs. You must provide a value for this parameter if you specify InstanceIds for the TargetType parameter.      TargetTagKey    Description: (Optional) The tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      TargetTagValue    Description: (Optional) The value of the tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      ResourceGroupName    Description: (Optional) The name of the resource group associated with the instances you want to target. You must provide a value for this parameter if you specify ResourceGroups for the TargetType parameter.      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Distributor (Type: Amazon Web ServicesQuickSetupType-Distributor)     PackagesToInstall    Description: (Required) A comma separated list of packages you want to install on the target instances. The valid values are AWSEFSTools, AWSCWAgent, and AWSEC2LaunchAgent.      RemediationSchedule    Description: (Optional) A rate expression that defines the schedule for drift remediation. The valid values are rate(30 days), rate(14 days), rate(2 days), and none. The default value is "rate(30 days)".      IsPolicyAttachAllowed    Description: (Optional) A boolean value that determines whether Quick Setup attaches policies to instances profiles already associated with the target instances. The default value is "false".      TargetType    Description: (Optional) Determines how instances are targeted for local account deployments. Don't specify a value for this parameter if you're deploying to OUs. The valid values are *, InstanceIds, ResourceGroups, and Tags. Use * to target all instances in the account.      TargetInstances    Description: (Optional) A comma separated list of instance IDs. You must provide a value for this parameter if you specify InstanceIds for the TargetType parameter.      TargetTagKey    Description: (Required) The tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      TargetTagValue    Description: (Required) The value of the tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      ResourceGroupName    Description: (Required) The name of the resource group associated with the instances you want to target. You must provide a value for this parameter if you specify ResourceGroups for the TargetType parameter.      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.      Patch Policy (Type: Amazon Web ServicesQuickSetupType-PatchPolicy)     PatchPolicyName    Description: (Required) A name for the patch policy. The value you provide is applied to target Amazon EC2 instances as a tag.      SelectedPatchBaselines    Description: (Required) An array of JSON objects containing the information for the patch baselines to include in your patch policy.      PatchBaselineUseDefault    Description: (Optional) A boolean value that determines whether the selected patch baselines are all Amazon Web Services provided.      ConfigurationOptionsPatchOperation    Description: (Optional) Determines whether target instances scan for available patches, or scan and install available patches. The valid values are Scan and ScanAndInstall. The default value for the parameter is Scan.      ConfigurationOptionsScanValue    Description: (Optional) A cron expression that is used as the schedule for when instances scan for available patches.      ConfigurationOptionsInstallValue    Description: (Optional) A cron expression that is used as the schedule for when instances install available patches.      ConfigurationOptionsScanNextInterval    Description: (Optional) A boolean value that determines whether instances should scan for available patches at the next cron interval. The default value is "false".      ConfigurationOptionsInstallNextInterval    Description: (Optional) A boolean value that determines whether instances should scan for available patches at the next cron interval. The default value is "false".      RebootOption    Description: (Optional) Determines whether instances are rebooted after patches are installed. Valid values are RebootIfNeeded and NoReboot.      IsPolicyAttachAllowed    Description: (Optional) A boolean value that determines whether Quick Setup attaches policies to instances profiles already associated with the target instances. The default value is "false".      OutputLogEnableS3    Description: (Optional) A boolean value that determines whether command output logs are sent to Amazon S3.      OutputS3Location    Description: (Optional) A JSON string containing information about the Amazon S3 bucket where you want to store the output details of the request.    OutputS3BucketRegion    Description: (Optional) The Amazon Web Services Region where the Amazon S3 bucket you want Config to deliver command output to is located.      OutputS3BucketName    Description: (Optional) The name of the Amazon S3 bucket you want Config to deliver command output to.      OutputS3KeyPrefix    Description: (Optional) The key prefix you want to use in the custom Amazon S3 bucket.          TargetType    Description: (Optional) Determines how instances are targeted for local account deployments. Don't specify a value for this parameter if you're deploying to OUs. The valid values are *, InstanceIds, ResourceGroups, and Tags. Use * to target all instances in the account.      TargetInstances    Description: (Optional) A comma separated list of instance IDs. You must provide a value for this parameter if you specify InstanceIds for the TargetType parameter.      TargetTagKey    Description: (Required) The tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      TargetTagValue    Description: (Required) The value of the tag key assigned to the instances you want to target. You must provide a value for this parameter if you specify Tags for the TargetType parameter.      ResourceGroupName    Description: (Required) The name of the resource group associated with the instances you want to target. You must provide a value for this parameter if you specify ResourceGroups for the TargetType parameter.      TargetAccounts    Description: (Optional) The ID of the Amazon Web Services account initiating the configuration deployment. You only need to provide a value for this parameter if you want to deploy the configuration locally. A value must be provided for either TargetAccounts or TargetOrganizationalUnits.      TargetOrganizationalUnits    Description: (Optional) A comma separated list of organizational units (OUs) you want to deploy the configuration to.      TargetRegions    Description: (Required) A comma separated list of Amazon Web Services Regions you want to deploy the configuration to.
        public let parameters: [String: String]
        /// The type of the Quick Setup configuration.
        public let type: String
        /// The version of the Quick Setup type to use.
        public let typeVersion: String?

        @inlinable
        public init(localDeploymentAdministrationRoleArn: String? = nil, localDeploymentExecutionRoleName: String? = nil, parameters: [String: String], type: String, typeVersion: String? = nil) {
            self.localDeploymentAdministrationRoleArn = localDeploymentAdministrationRoleArn
            self.localDeploymentExecutionRoleName = localDeploymentExecutionRoleName
            self.parameters = parameters
            self.type = type
            self.typeVersion = typeVersion
        }

        private enum CodingKeys: String, CodingKey {
            case localDeploymentAdministrationRoleArn = "LocalDeploymentAdministrationRoleArn"
            case localDeploymentExecutionRoleName = "LocalDeploymentExecutionRoleName"
            case parameters = "Parameters"
            case type = "Type"
            case typeVersion = "TypeVersion"
        }
    }

    public struct ConfigurationDefinitionSummary: AWSDecodableShape {
        /// The common parameters and values for the configuration definition.
        public let firstClassParameters: [String: String]?
        /// The ID of the configuration definition.
        public let id: String?
        /// The type of the Quick Setup configuration used by the configuration definition.
        public let type: String?
        /// The version of the Quick Setup type used by the configuration definition.
        public let typeVersion: String?

        @inlinable
        public init(firstClassParameters: [String: String]? = nil, id: String? = nil, type: String? = nil, typeVersion: String? = nil) {
            self.firstClassParameters = firstClassParameters
            self.id = id
            self.type = type
            self.typeVersion = typeVersion
        }

        private enum CodingKeys: String, CodingKey {
            case firstClassParameters = "FirstClassParameters"
            case id = "Id"
            case type = "Type"
            case typeVersion = "TypeVersion"
        }
    }

    public struct ConfigurationManagerSummary: AWSDecodableShape {
        /// A summary of the Quick Setup configuration definition.
        public let configurationDefinitionSummaries: [ConfigurationDefinitionSummary]?
        /// The description of the configuration.
        public let description: String?
        /// The ARN of the Quick Setup configuration.
        public let managerArn: String
        /// The name of the configuration
        public let name: String?
        /// Summaries of the state of the configuration manager. These summaries include an aggregate of the statuses from the configuration definition associated with the configuration manager. This includes deployment statuses, association statuses, drift statuses, health checks, and more.
        public let statusSummaries: [StatusSummary]?

        @inlinable
        public init(configurationDefinitionSummaries: [ConfigurationDefinitionSummary]? = nil, description: String? = nil, managerArn: String, name: String? = nil, statusSummaries: [StatusSummary]? = nil) {
            self.configurationDefinitionSummaries = configurationDefinitionSummaries
            self.description = description
            self.managerArn = managerArn
            self.name = name
            self.statusSummaries = statusSummaries
        }

        private enum CodingKeys: String, CodingKey {
            case configurationDefinitionSummaries = "ConfigurationDefinitionSummaries"
            case description = "Description"
            case managerArn = "ManagerArn"
            case name = "Name"
            case statusSummaries = "StatusSummaries"
        }
    }

    public struct ConfigurationSummary: AWSDecodableShape {
        /// The ID of the Amazon Web Services account where the configuration was deployed.
        public let account: String?
        /// The ID of the configuration definition.
        public let configurationDefinitionId: String?
        /// The datetime stamp when the configuration was created.
        public let createdAt: Date?
        /// The common parameters and values for the configuration definition.
        public let firstClassParameters: [String: String]?
        /// A service generated identifier for the configuration.
        public let id: String?
        /// The ARN of the configuration manager.
        public let managerArn: String?
        /// The Amazon Web Services Region where the configuration was deployed.
        public let region: String?
        /// A summary of the state of the configuration manager. This includes deployment statuses, association statuses, drift statuses, health checks, and more.
        public let statusSummaries: [StatusSummary]?
        /// The type of the Quick Setup configuration.
        public let type: String?
        /// The version of the Quick Setup type used.
        public let typeVersion: String?

        @inlinable
        public init(account: String? = nil, configurationDefinitionId: String? = nil, createdAt: Date? = nil, firstClassParameters: [String: String]? = nil, id: String? = nil, managerArn: String? = nil, region: String? = nil, statusSummaries: [StatusSummary]? = nil, type: String? = nil, typeVersion: String? = nil) {
            self.account = account
            self.configurationDefinitionId = configurationDefinitionId
            self.createdAt = createdAt
            self.firstClassParameters = firstClassParameters
            self.id = id
            self.managerArn = managerArn
            self.region = region
            self.statusSummaries = statusSummaries
            self.type = type
            self.typeVersion = typeVersion
        }

        private enum CodingKeys: String, CodingKey {
            case account = "Account"
            case configurationDefinitionId = "ConfigurationDefinitionId"
            case createdAt = "CreatedAt"
            case firstClassParameters = "FirstClassParameters"
            case id = "Id"
            case managerArn = "ManagerArn"
            case region = "Region"
            case statusSummaries = "StatusSummaries"
            case type = "Type"
            case typeVersion = "TypeVersion"
        }
    }

    public struct CreateConfigurationManagerInput: AWSEncodableShape {
        /// The definition of the Quick Setup configuration that the configuration manager deploys.
        public let configurationDefinitions: [ConfigurationDefinitionInput]
        /// A description of the configuration manager.
        public let description: String?
        /// A name for the configuration manager.
        public let name: String?
        /// Key-value pairs of metadata to assign to the configuration manager.
        public let tags: [String: String]?

        @inlinable
        public init(configurationDefinitions: [ConfigurationDefinitionInput], description: String? = nil, name: String? = nil, tags: [String: String]? = nil) {
            self.configurationDefinitions = configurationDefinitions
            self.description = description
            self.name = name
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case configurationDefinitions = "ConfigurationDefinitions"
            case description = "Description"
            case name = "Name"
            case tags = "Tags"
        }
    }

    public struct CreateConfigurationManagerOutput: AWSDecodableShape {
        /// The ARN for the newly created configuration manager.
        public let managerArn: String

        @inlinable
        public init(managerArn: String) {
            self.managerArn = managerArn
        }

        private enum CodingKeys: String, CodingKey {
            case managerArn = "ManagerArn"
        }
    }

    public struct DeleteConfigurationManagerInput: AWSEncodableShape {
        /// The ID of the configuration manager.
        public let managerArn: String

        @inlinable
        public init(managerArn: String) {
            self.managerArn = managerArn
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.managerArn, key: "ManagerArn")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct Filter: AWSEncodableShape {
        /// The key for the filter.
        public let key: String
        /// The values for the filter keys.
        public let values: [String]

        @inlinable
        public init(key: String, values: [String]) {
            self.key = key
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct GetConfigurationInput: AWSEncodableShape {
        /// A service generated identifier for the configuration.
        public let configurationId: String

        @inlinable
        public init(configurationId: String) {
            self.configurationId = configurationId
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.configurationId, key: "ConfigurationId")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetConfigurationManagerInput: AWSEncodableShape {
        /// The ARN of the configuration manager.
        public let managerArn: String

        @inlinable
        public init(managerArn: String) {
            self.managerArn = managerArn
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.managerArn, key: "ManagerArn")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetConfigurationManagerOutput: AWSDecodableShape {
        /// The configuration definitions association with the configuration manager.
        public let configurationDefinitions: [ConfigurationDefinition]?
        /// The datetime stamp when the configuration manager was created.
        public let createdAt: Date?
        /// The description of the configuration manager.
        public let description: String?
        /// The datetime stamp when the configuration manager was last updated.
        public let lastModifiedAt: Date?
        /// The ARN of the configuration manager.
        public let managerArn: String
        /// The name of the configuration manager.
        public let name: String?
        /// A summary of the state of the configuration manager. This includes deployment statuses, association statuses, drift statuses, health checks, and more.
        public let statusSummaries: [StatusSummary]?
        /// Key-value pairs of metadata to assign to the configuration manager.
        public let tags: [String: String]?

        @inlinable
        public init(configurationDefinitions: [ConfigurationDefinition]? = nil, createdAt: Date? = nil, description: String? = nil, lastModifiedAt: Date? = nil, managerArn: String, name: String? = nil, statusSummaries: [StatusSummary]? = nil, tags: [String: String]? = nil) {
            self.configurationDefinitions = configurationDefinitions
            self.createdAt = createdAt
            self.description = description
            self.lastModifiedAt = lastModifiedAt
            self.managerArn = managerArn
            self.name = name
            self.statusSummaries = statusSummaries
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case configurationDefinitions = "ConfigurationDefinitions"
            case createdAt = "CreatedAt"
            case description = "Description"
            case lastModifiedAt = "LastModifiedAt"
            case managerArn = "ManagerArn"
            case name = "Name"
            case statusSummaries = "StatusSummaries"
            case tags = "Tags"
        }
    }

    public struct GetConfigurationOutput: AWSDecodableShape {
        /// The ID of the Amazon Web Services account where the configuration was deployed.
        public let account: String?
        /// The ID of the configuration definition.
        public let configurationDefinitionId: String?
        /// The datetime stamp when the configuration manager was created.
        public let createdAt: Date?
        /// A service generated identifier for the configuration.
        public let id: String?
        /// The datetime stamp when the configuration manager was last updated.
        public let lastModifiedAt: Date?
        /// The ARN of the configuration manager.
        public let managerArn: String?
        /// The parameters for the configuration definition type.
        public let parameters: [String: String]?
        /// The Amazon Web Services Region where the configuration was deployed.
        public let region: String?
        /// A summary of the state of the configuration manager. This includes deployment statuses, association statuses, drift statuses, health checks, and more.
        public let statusSummaries: [StatusSummary]?
        /// The type of the Quick Setup configuration.
        public let type: String?
        /// The version of the Quick Setup type used.
        public let typeVersion: String?

        @inlinable
        public init(account: String? = nil, configurationDefinitionId: String? = nil, createdAt: Date? = nil, id: String? = nil, lastModifiedAt: Date? = nil, managerArn: String? = nil, parameters: [String: String]? = nil, region: String? = nil, statusSummaries: [StatusSummary]? = nil, type: String? = nil, typeVersion: String? = nil) {
            self.account = account
            self.configurationDefinitionId = configurationDefinitionId
            self.createdAt = createdAt
            self.id = id
            self.lastModifiedAt = lastModifiedAt
            self.managerArn = managerArn
            self.parameters = parameters
            self.region = region
            self.statusSummaries = statusSummaries
            self.type = type
            self.typeVersion = typeVersion
        }

        private enum CodingKeys: String, CodingKey {
            case account = "Account"
            case configurationDefinitionId = "ConfigurationDefinitionId"
            case createdAt = "CreatedAt"
            case id = "Id"
            case lastModifiedAt = "LastModifiedAt"
            case managerArn = "ManagerArn"
            case parameters = "Parameters"
            case region = "Region"
            case statusSummaries = "StatusSummaries"
            case type = "Type"
            case typeVersion = "TypeVersion"
        }
    }

    public struct GetServiceSettingsOutput: AWSDecodableShape {
        /// Returns details about the settings for Quick Setup in the requesting Amazon Web Services account and Amazon Web Services Region.
        public let serviceSettings: ServiceSettings?

        @inlinable
        public init(serviceSettings: ServiceSettings? = nil) {
            self.serviceSettings = serviceSettings
        }

        private enum CodingKeys: String, CodingKey {
            case serviceSettings = "ServiceSettings"
        }
    }

    public struct ListConfigurationManagersInput: AWSEncodableShape {
        /// Filters the results returned by the request.
        public let filters: [Filter]?
        /// Specifies the maximum number of configuration managers that are returned by the request.
        public let maxItems: Int?
        /// The token to use when requesting a specific set of items from a list.
        public let startingToken: String?

        @inlinable
        public init(filters: [Filter]? = nil, maxItems: Int? = nil, startingToken: String? = nil) {
            self.filters = filters
            self.maxItems = maxItems
            self.startingToken = startingToken
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxItems = "MaxItems"
            case startingToken = "StartingToken"
        }
    }

    public struct ListConfigurationManagersOutput: AWSDecodableShape {
        /// The configuration managers returned by the request.
        public let configurationManagersList: [ConfigurationManagerSummary]?
        /// The token to use when requesting the next set of configuration managers. If there are no additional operations to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(configurationManagersList: [ConfigurationManagerSummary]? = nil, nextToken: String? = nil) {
            self.configurationManagersList = configurationManagersList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case configurationManagersList = "ConfigurationManagersList"
            case nextToken = "NextToken"
        }
    }

    public struct ListConfigurationsInput: AWSEncodableShape {
        /// The ID of the configuration definition.
        public let configurationDefinitionId: String?
        /// Filters the results returned by the request.
        public let filters: [Filter]?
        /// The ARN of the configuration manager.
        public let managerArn: String?
        /// Specifies the maximum number of configurations that are returned by the request.
        public let maxItems: Int?
        /// The token to use when requesting a specific set of items from a list.
        public let startingToken: String?

        @inlinable
        public init(configurationDefinitionId: String? = nil, filters: [Filter]? = nil, managerArn: String? = nil, maxItems: Int? = nil, startingToken: String? = nil) {
            self.configurationDefinitionId = configurationDefinitionId
            self.filters = filters
            self.managerArn = managerArn
            self.maxItems = maxItems
            self.startingToken = startingToken
        }

        private enum CodingKeys: String, CodingKey {
            case configurationDefinitionId = "ConfigurationDefinitionId"
            case filters = "Filters"
            case managerArn = "ManagerArn"
            case maxItems = "MaxItems"
            case startingToken = "StartingToken"
        }
    }

    public struct ListConfigurationsOutput: AWSDecodableShape {
        /// An array of configurations.
        public let configurationsList: [ConfigurationSummary]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(configurationsList: [ConfigurationSummary]? = nil, nextToken: String? = nil) {
            self.configurationsList = configurationsList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case configurationsList = "ConfigurationsList"
            case nextToken = "NextToken"
        }
    }

    public struct ListQuickSetupTypesOutput: AWSDecodableShape {
        /// An array of Quick Setup types.
        public let quickSetupTypeList: [QuickSetupTypeOutput]?

        @inlinable
        public init(quickSetupTypeList: [QuickSetupTypeOutput]? = nil) {
            self.quickSetupTypeList = quickSetupTypeList
        }

        private enum CodingKeys: String, CodingKey {
            case quickSetupTypeList = "QuickSetupTypeList"
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        /// The ARN of the resource the tag is assigned to.
        public let resourceArn: String

        @inlinable
        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "ResourceArn")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListTagsForResourceResponse: AWSDecodableShape {
        /// Key-value pairs of metadata assigned to the resource.
        public let tags: [TagEntry]?

        @inlinable
        public init(tags: [TagEntry]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct QuickSetupTypeOutput: AWSDecodableShape {
        /// The latest version number of the configuration.
        public let latestVersion: String?
        /// The type of the Quick Setup configuration.
        public let type: String?

        @inlinable
        public init(latestVersion: String? = nil, type: String? = nil) {
            self.latestVersion = latestVersion
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case latestVersion = "LatestVersion"
            case type = "Type"
        }
    }

    public struct ServiceSettings: AWSDecodableShape {
        /// The IAM role used to enable Explorer.
        public let explorerEnablingRoleArn: String?

        @inlinable
        public init(explorerEnablingRoleArn: String? = nil) {
            self.explorerEnablingRoleArn = explorerEnablingRoleArn
        }

        private enum CodingKeys: String, CodingKey {
            case explorerEnablingRoleArn = "ExplorerEnablingRoleArn"
        }
    }

    public struct StatusSummary: AWSDecodableShape {
        /// The datetime stamp when the status was last updated.
        public let lastUpdatedAt: Date
        /// The current status.
        public let status: Status?
        /// Details about the status.
        public let statusDetails: [String: String]?
        /// When applicable, returns an informational message relevant to the current status and status type of the status summary object. We don't recommend implementing parsing logic around this value since the messages returned can vary in format.
        public let statusMessage: String?
        /// The type of a status summary.
        public let statusType: StatusType

        @inlinable
        public init(lastUpdatedAt: Date, status: Status? = nil, statusDetails: [String: String]? = nil, statusMessage: String? = nil, statusType: StatusType) {
            self.lastUpdatedAt = lastUpdatedAt
            self.status = status
            self.statusDetails = statusDetails
            self.statusMessage = statusMessage
            self.statusType = statusType
        }

        private enum CodingKeys: String, CodingKey {
            case lastUpdatedAt = "LastUpdatedAt"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case statusMessage = "StatusMessage"
            case statusType = "StatusType"
        }
    }

    public struct TagEntry: AWSDecodableShape {
        /// The key for the tag.
        public let key: String?
        /// The value for the tag.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagResourceInput: AWSEncodableShape {
        /// The ARN of the resource to tag.
        public let resourceArn: String
        /// Key-value pairs of metadata to assign to the resource.
        public let tags: [String: String]

        @inlinable
        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "ResourceArn")
            try container.encode(self.tags, forKey: .tags)
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct UntagResourceInput: AWSEncodableShape {
        /// The ARN of the resource to remove tags from.
        public let resourceArn: String
        /// The keys of the tags to remove from the resource.
        public let tagKeys: [String]

        @inlinable
        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "ResourceArn")
            request.encodeQuery(self.tagKeys, key: "tagKeys")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct UpdateConfigurationDefinitionInput: AWSEncodableShape {
        /// The ID of the configuration definition you want to update.
        public let id: String
        /// The ARN of the IAM role used to administrate local configuration deployments.
        public let localDeploymentAdministrationRoleArn: String?
        /// The name of the IAM role used to deploy local configurations.
        public let localDeploymentExecutionRoleName: String?
        /// The ARN of the configuration manager associated with the definition to update.
        public let managerArn: String
        /// The parameters for the configuration definition type.
        public let parameters: [String: String]?
        /// The version of the Quick Setup type to use.
        public let typeVersion: String?

        @inlinable
        public init(id: String, localDeploymentAdministrationRoleArn: String? = nil, localDeploymentExecutionRoleName: String? = nil, managerArn: String, parameters: [String: String]? = nil, typeVersion: String? = nil) {
            self.id = id
            self.localDeploymentAdministrationRoleArn = localDeploymentAdministrationRoleArn
            self.localDeploymentExecutionRoleName = localDeploymentExecutionRoleName
            self.managerArn = managerArn
            self.parameters = parameters
            self.typeVersion = typeVersion
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.id, key: "Id")
            try container.encodeIfPresent(self.localDeploymentAdministrationRoleArn, forKey: .localDeploymentAdministrationRoleArn)
            try container.encodeIfPresent(self.localDeploymentExecutionRoleName, forKey: .localDeploymentExecutionRoleName)
            request.encodePath(self.managerArn, key: "ManagerArn")
            try container.encodeIfPresent(self.parameters, forKey: .parameters)
            try container.encodeIfPresent(self.typeVersion, forKey: .typeVersion)
        }

        private enum CodingKeys: String, CodingKey {
            case localDeploymentAdministrationRoleArn = "LocalDeploymentAdministrationRoleArn"
            case localDeploymentExecutionRoleName = "LocalDeploymentExecutionRoleName"
            case parameters = "Parameters"
            case typeVersion = "TypeVersion"
        }
    }

    public struct UpdateConfigurationManagerInput: AWSEncodableShape {
        /// A description of the configuration manager.
        public let description: String?
        /// The ARN of the configuration manager.
        public let managerArn: String
        /// A name for the configuration manager.
        public let name: String?

        @inlinable
        public init(description: String? = nil, managerArn: String, name: String? = nil) {
            self.description = description
            self.managerArn = managerArn
            self.name = name
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encodeIfPresent(self.description, forKey: .description)
            request.encodePath(self.managerArn, key: "ManagerArn")
            try container.encodeIfPresent(self.name, forKey: .name)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
        }
    }

    public struct UpdateServiceSettingsInput: AWSEncodableShape {
        /// The IAM role used to enable Explorer.
        public let explorerEnablingRoleArn: String?

        @inlinable
        public init(explorerEnablingRoleArn: String? = nil) {
            self.explorerEnablingRoleArn = explorerEnablingRoleArn
        }

        private enum CodingKeys: String, CodingKey {
            case explorerEnablingRoleArn = "ExplorerEnablingRoleArn"
        }
    }
}

// MARK: - Errors

/// Error enum for SSMQuickSetup
public struct SSMQuickSetupErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case conflictException = "ConflictException"
        case internalServerException = "InternalServerException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case throttlingException = "ThrottlingException"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize SSMQuickSetup
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// The requester has insufficient permissions to perform the operation.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// Another request is being processed. Wait a few minutes and try again.
    public static var conflictException: Self { .init(.conflictException) }
    /// An error occurred on the server side.
    public static var internalServerException: Self { .init(.internalServerException) }
    /// The resource couldn't be found. Check the ID or name and try again.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The request or operation exceeds the maximum allowed request rate per Amazon Web Services account and Amazon Web Services Region.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// The request is invalid. Verify the values provided for the request parameters are accurate.
    public static var validationException: Self { .init(.validationException) }
}

extension SSMQuickSetupErrorType: Equatable {
    public static func == (lhs: SSMQuickSetupErrorType, rhs: SSMQuickSetupErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension SSMQuickSetupErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
